package cn.gongxi._05mvcboot01.controller;

import cn.gongxi._05mvcboot01.common.response.JsonResult;
import cn.gongxi._05mvcboot01.mapper.UserMapper;
import cn.gongxi._05mvcboot01.pojo.dto.InsertUserDTO;
import cn.gongxi._05mvcboot01.pojo.entity.User;
import cn.gongxi._05mvcboot01.pojo.vo.UserListVO;
import cn.gongxi._05mvcboot01.pojo.vo.UserVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

/**
 * @RestController 注解：
    1、自动装配
    2、返回数据类型：
        2.1 如果是页面，则返回String类型
        2.2 如果是数据，则返回JSON类型
        2.3 如果是数据，并且需要返回对象，则返回JSON类型
        2.4 如果是数据，并且需要返回集合，则返回JSON类型

 相当于@Controller + @ResponseBody
 @ResponseBody 注解 作用 1：允许返回数据类型为String
 2、将数据返回类型为JSON

 RESTful风格：
 1、URL地址  域名中体现api字样
 2、请求方式  GET POST PUT DELETE
 GetMapping()  PostMapping()  PutMapping()  DeleteMapping()
 3、请求参数
 4、HTTP状态码
 200 服务器成功返回用户请求的数据
 404 用户发出的请求针对的资源不存在
 500 服务器发生错误
 405

 获取地址当中的变量
 需要使用@PathVariable注解

 例如：
 @GetMapping("{id}")
 public User selectById(@PathVariable int id){
 // 自己定义相对应的接口方法
 return userMapper.selectById(id);
 }

 */
//@Controller
@Slf4j
@Api(tags = "用户模块")
@RestController
@RequestMapping("/v1/users")
public class UserController {
    // 自动装配  required = false 不管你是否装配成功都不报错
    // required = true  必须装配成功，否则报错
    @Autowired
    private UserMapper userMapper;

    /*
    1、确定是否需要VO或者DTO类   查询需要VO   插入使用实体类
    2、梳理业务逻辑，确定接口，以注册功能为例
        2.1 接收客户端传递的参数；
        2.2 校验数据合法性
        2.3 确定用户名是否被占用[SELECT接口]
            2.3.1 如果被占用，返回提示信息
            2.3.2 如果没被占用，执行插入操作[INSERT接口]
     */
//    @RequestMapping("/insert")
//    @ResponseBody
    @PostMapping("/insert")
    @ApiOperation("用户注册")
    public JsonResult insertUser(@RequestBody InsertUserDTO insertUserDTO){ // 传递dto类

        // 如果不确定，先去Test里面测试方法

        // 确定，就直接调用

        // 日志
        log.debug("用户注册信息：{}",insertUserDTO);

        User user = new User();
        // 理论上，我们需要从dto类中get方法去获取数据
        // 再在实体类中set方法去设置数据
        // 但是Spring Boot提供了Bean.copyProperties方法，可以自动拷贝
        BeanUtils.copyProperties(insertUserDTO,user);
        user.setCreated(new Date());
        try{
            userMapper.insertUser(user);
        }catch (Exception e){
            System.out.println(e.getMessage());
        }

        return JsonResult.success();
    }

    /*
    2、查询用户列表功能
        2，1 确定是否需要VO或者DTO类   查询需要VO   插入使用实体类
        2，2 确定接口及完成接口方法和xml
        2，3 Controller层调用接口方法
        2，4 重启工程，进行测试
     */

//    @RequestMapping("/userList")
//    @ResponseBody
    @GetMapping("/userList")
    @ApiOperation("用户列表")
    public JsonResult getUserList(){

        // 调用查询方法

        return JsonResult.success( userMapper.userList());
    }

    /*
    3、删除用户功能
     */
//    @RequestMapping("/delete")
//    @ResponseBody
    @GetMapping("/delete")
    @ApiOperation("通过id删除用户")
    @ApiImplicitParam(name ="id",value="用户id",dataType = "long",example = "1",required = true)
    public JsonResult deleteUser(Integer id){

        // 调用删除方法
        userMapper.deleteUser(id);

        return JsonResult.success();
    }

    /*
    4、更新用户功能
     */
    // 如果API文档里面的参数是实体类，那么直接接收实体类即可
//    @RequestMapping("/update")
//    @ResponseBody
    @PostMapping("/update")
    @ApiOperation("更新用户信息")
    public JsonResult updateUser(@RequestBody User user){
        log.debug("更新用户信息：{}",user);
        // 调用更新方法
        userMapper.updateUser(user);

        return JsonResult.success();
    }

    /*
    5、根据id查询指定用户的用户名，密码，昵称
        创建 VO类
     */
    @GetMapping("/select/{id}")
    @ApiOperation("根据id查询指定用户的用户名，密码，昵称")
    public JsonResult selectById(@PathVariable Integer id){

        log.debug("id：{}",id);
        // 调用查询方法
        // 抛出异常
        if(id<=0){
            throw new IllegalArgumentException("id必须大于0");
        }
        return  JsonResult.success(userMapper.selectById(id));

    }
}
